﻿#!/usr/bin/perl
use LWP::UserAgent;
use HTTP::Cookies;
use HTTP::Request::Common;

#$myCookies = HTTP::Cookies->new(
#    file     => "cookies.txt", 
#    autosave => 1, 
#    );
$myCookies = HTTP::Cookies->new();

$URL  = "https://www.example.com/w/signup.php";
$UA   = LWP::UserAgent->new();
$UA->cookie_jar( $myCookies );

# Wyszukanie określonego pliku cookie w podanej domenie. Dodanie jednego tygodnia do
# daty utraty ważności. Usunięcie pierwotnego pliku cookie, zapisanie zmodyfikowanego pliku 
# cookie w zbiorczym pliku. Skrypt wykorzystuje zewnętrzną przestrzeń nazw ($find::) do
# uzyskania klucza, ścieżki i przeszukiwanej domeny. Ustawia atrybut $find::changed
# w celu wskazania liczby znalezionych pasujących plików cookie, które zmodyfikowano.
sub addOneWeek {
    my ($version, $key, $val, $path, $domain, $port, $path_spec,
        $secure, $expires, $discard, $rest) = @_;

    if( ($domain eq $find::domain) and
        ($path   eq $find::path  ) and
        ($key    eq $find::key   ) )
        {
            $expires = $expires + (3600 * 24 * 7); # seconds per week
            $myCookies->clear( $domain, $path, $key );
            $myCookies->set_cookie( $version, $key, $val, $path,
                $domain, $port, $path_spec,    $secure, $expires, $discard,
                $rest );
            $find::changed++;
        }
}

# Wyszukanie określonego pliku cookie w podanej domenie. Skrypt wykorzystuje zewnętrzną przestrzeń nazw ($find::)
# do uzyskania klucza, ścieżki i przeszukiwanej domeny. Wyświetla
# wszystkie pasujące pliki cookie.
sub showCookies {
    my ($version, $key, $val, $path, $domain, $port, $path_spec,
        $secure, $expires, $discard, $rest) = @_;

    if( ($domain eq $find::domain) and
        ($path   eq $find::path  ) and
        ($key    eq $find::key   ) )
        {
            print "$domain, $path, $key, $val, $expires\n";
        }
}

# Pobranie strony WWW, która wysyła plik cookie.
$req  = HTTP::Request->new( GET => $URL );
$resp = $UA->request($req);

$find::domain = "example.com";
$find::path   = "/";
$find::key    = "session_id";

# Pokazanie pasujących plików cookie w ich oryginalnej postaci.
$myCookies->scan( \&showCookies );

# Wyszukanie ich i wydłużenie okresu ważności o tydzień.
$myCookies->scan( \&addOneWeek  );

# Wyświetlenie zawartości zbiorczego pliku cookie po wprowadzeniu modyfikacji.
$myCookies->scan( \&showCookies );
